package bancosys.tec.utils.loader;

import static jmine.tec.utils.UtilsMessages.RESOURCE_NOT_FOUND_CLASSPATH_AND_BASE_PATH;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import org.apache.log4j.Logger;

/**
 * @created 05/09/2007
 * @author Gustavo Almeida
 */
public class ResourceLoader {
    private String basePath = "";

    /**
     * Define a property de onde o base path será lido.
     * 
     * @param basePathProperty a property de onde o base path será lido.
     */
    public void setBasePathProperty(String basePathProperty) {
        String path = System.getProperty(basePathProperty);
        if (path == null) {
            Logger.getLogger(ResourceLoader.class).error("Propriedade '" + basePathProperty + "' não definida.");
        }
        this.setBasePath(path);
    }

    /**
     * Define o basePath de onde os resources serão carregados.
     * 
     * @param basePath path de onde os resources serão carregados.
     */
    public void setBasePath(String basePath) {
        if (basePath == null) {
            this.basePath = "";
        } else {
            this.basePath = basePath.trim();
            if (this.basePath.length() > 0 && !this.basePath.endsWith(File.pathSeparator)) {
                this.basePath = this.basePath + File.separator;
            }
        }
        Logger.getLogger(ResourceLoader.class).debug("Base path: " + this.basePath);
    }

    /**
     * Devolve o caminho base utilizado.
     * 
     * @return o caminho base utilizado.
     */
    public String getBasePath() {
        return this.basePath;
    }

    /**
     * Recupera um recurso.
     * 
     * @param relativePath o caminho relativo do recurso.
     * @return um <code>InutStream</code> do recurso.
     * @throws ResourceLoaderException Caso o recurso não seja encontrado.
     */
    public InputStream getResourceAsStream(String relativePath) throws ResourceLoaderException {
        InputStream in;

        try {
            in = new FileInputStream(this.getBasePath() + relativePath);
        } catch (FileNotFoundException e) {
            in = this.getClass().getClassLoader().getResourceAsStream(relativePath);
            if (in == null) {
                throw new ResourceLoaderException(RESOURCE_NOT_FOUND_CLASSPATH_AND_BASE_PATH.create(relativePath, this.getBasePath()));
            }
        }

        return in;
    }
}